package com.huya.service.impl;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.huya.common.constant.MessageConstant;
import com.huya.common.context.BaseContext;
import com.huya.common.exception.LoginFailedException;
import com.huya.common.properties.WeChatProperties;
import com.huya.common.utils.HttpClientUtil;
import com.huya.common.utils.WechatDecryptUtil;
import com.huya.mapper.UserMapper;
import com.huya.pojo.dto.UserLoginDTO;
import com.huya.pojo.dto.UserUpdateDTO;
import com.huya.pojo.entity.User;
import com.huya.pojo.vo.UserVO;
import com.huya.service.UserService;
import io.micrometer.common.util.StringUtils;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.time.LocalDateTime;
import java.util.HashMap;
import java.util.Map;



@Service
@Slf4j
public class UserServiceImpl implements UserService {
    public static final String WX_LOGIN = "https://api.weixin.qq.com/sns/jscode2session";
    @Autowired
    private WeChatProperties weChatProperties;
    @Autowired
    private UserMapper userMapper;

    /**
     *
     * 微信登录
     * @param userLoginDTO
     * @return
     */
    public User wxLogin(UserLoginDTO userLoginDTO) {
        String openid = getOpenid(userLoginDTO.getCode());
        if(openid == null){
            throw new LoginFailedException(MessageConstant.LOGIN_FAILED);
        }
        //判断当前用户用户是否为新用户
        User user = userMapper.getByOpenid(openid);
        //如果是新用户，则更新用户信息
        if(user == null){
            user= User.builder()
                    .openid(openid)
                    .createTime(LocalDateTime.now())
                    .build();
            userMapper.insert(user);
        }
        //返回用户信息
        return user;
    }

    /**、
     * 获取微信openid
     * @param code
     * @return
     */
    private String getOpenid(String code) {
        Map<String, String> map = new HashMap<>();
        map.put("appid",weChatProperties.getAppid());
        map.put("secret",weChatProperties.getSecret());
        map.put("js_code",code);
        map.put("grant_type","authorization_code");
        String json = HttpClientUtil.doGet(WX_LOGIN,map);
        JSONObject jsonObject = JSON.parseObject(json);
        String openid = jsonObject.getString("openid");
        return openid;
    }

    /**
     * 更新用户信息
     *
     * @param userUpdateDTO
     * @return
     */
    public void update(UserUpdateDTO userUpdateDTO) {
        userMapper.update(userUpdateDTO);
    }

    /**
     *  获取用户信息
     * @return
     */

    public UserVO getUserInfo() {
        Long userId = BaseContext.getCurrentId();
        User user = userMapper.findById(userId);
        UserVO userVO = new UserVO();
        BeanUtils.copyProperties(user, userVO);
        return userVO;
    }


//    public User wxLogin(UserLoginDTO userLoginDTO) {
//        // 1. 获取会话信息
//        Map<String, String> sessionInfo = getSessionInfo(userLoginDTO.getCode());
//        String openid = sessionInfo.get("openid");
//        String sessionKey = sessionInfo.get("session_key");
//
//        // 2. 保存/更新会话密钥
////        redisTemplate.opsForValue().set(
////                "wechat:session:" + openid,
////                sessionKey,
////                3, TimeUnit.DAYS
////        );
//
//        // 3. 查询或创建用户
//        User user = userMapper.getByOpenid(openid);
//        if (user == null) {
//            // 解密基础用户信息
//            JSONObject userInfo = WechatDecryptUtil.decryptUserInfo(
//                    userLoginDTO.getEncryptedData(),
//                    userLoginDTO.getIv(),
//                    sessionKey
//            );
//
//            user = buildUserFromWechatInfo(openid, userInfo);
//            userMapper.insert(user);
//        }
//
//        // 4. 解密并更新手机号（如果有）
//        if (StringUtils.isNotEmpty(userLoginDTO.getPhoneEncryptedData())) {
//            String phone = WechatDecryptUtil.decryptPhoneNumber(
//                    userLoginDTO.getPhoneEncryptedData(),
//                    userLoginDTO.getPhoneIv(),
//                    sessionKey
//            );
//            user.setPhone(phone);
//            userMapper.updateUserPhone(user.getId(), phone);
//        }
//
//        return user;
//    }
//
//    /**
//     * 获取微信session_key和openid
//     *
//     * @param code
//     * @return
//     */
//    private Map<String, String> getSessionInfo(String code) {
//        Map<String, String> paramMap = new HashMap<>();
//        paramMap.put("appid", weChatProperties.getAppid());
//        paramMap.put("secret", weChatProperties.getSecret());
//        paramMap.put("js_code", code);
//        paramMap.put("grant_type", "authorization_code");
//
//        String json = HttpClientUtil.doGet(WX_LOGIN, paramMap);
//        JSONObject jsonObject = JSON.parseObject(json);
//
//        if (jsonObject.containsKey("errcode")) {
//            throw new LoginFailedException("微信登录失败: " + jsonObject.getString("errmsg"));
//        }
//
//        Map<String, String> sessionInfo = new HashMap<>();
//        sessionInfo.put("openid", jsonObject.getString("openid"));
//        sessionInfo.put("session_key", jsonObject.getString("session_key"));
//        return sessionInfo;
//    }
//
//    private User buildUserFromWechatInfo(String openid, JSONObject userInfo) {
//        return User.builder()
//                .openid(openid)
//                .name(userInfo.getString("nickName"))
//                .avatar(userInfo.getString("avatarUrl"))
//                .sex(String.valueOf(userInfo.getInteger("gender")))
//                .createTime(LocalDateTime.now())
//                .build();
//    }
}
